package org.finir.fakturisanje.rich.web.conversation;

import java.io.Serializable;
import java.util.List;

import javax.faces.event.ActionEvent;

import org.finir.fakturisanje.business.service.KontrolerAL;
import org.finir.fakturisanje.persistence.Faktura;
import org.finir.fakturisanje.persistence.Komitent;
import org.finir.fakturisanje.persistence.PoreskaTarifa;
import org.finir.fakturisanje.persistence.Preduzece;
import org.finir.fakturisanje.persistence.StavkaFakture;
import org.finir.fakturisanje.persistence.Usluga;
import org.finir.fakturisanje.persistence.beans.FakturaBean;
import org.finir.fakturisanje.persistence.beans.StavkaFaktureBean;
import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.Begin;
import org.jboss.seam.annotations.End;
import org.jboss.seam.annotations.Factory;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Logger;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Out;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.annotations.datamodel.DataModel;
import org.jboss.seam.annotations.datamodel.DataModelSelection;
import org.jboss.seam.log.Log;

@Name("fakturaConversation")
@Scope(ScopeType.CONVERSATION)
public class FakturaConversation implements Serializable {
	/**
	 * 
	 */
	private static final long serialVersionUID = 5780711583503973133L;

	@Logger
	Log log;

	@In(required = true)
	Preduzece preduzeceLoggedIn;

	@In(create = true)
	@Out(required = false)
	@DataModelSelection("listFaktura")
	Faktura faktura;

	@In(create = true)
	@Out(required = false)
	@DataModelSelection("listStavkeFakture")
	StavkaFakture stavkaFakture;

	@In("#{kontrolerAL}")
	KontrolerAL kontrolerAL;

	@SuppressWarnings("unused")
	@DataModel("listFaktura")
	private List<Faktura> listFaktura;

	@DataModel("listStavkeFakture")
	private List<StavkaFakture> listStavkeFakture;

	public Integer getRedniBrojStavke() {
		Integer broj = null;
		if (this.faktura.getId() == null) {
			broj = faktura.getStavkeFakture().size();
		} else {
			broj = this.listStavkeFakture.size();
		}
		return 1 + broj;
	}

	@End(beforeRedirect = true)
	public String save() {

		log.info("save rb=" + faktura.getBrojFakture());
		faktura.setPreduzece(preduzeceLoggedIn);
		kontrolerAL.sacuvajEntitet(faktura);
		return "/izborfakture.xhtml";
	}

	public void sacuvajStavku() {

		stavkaFakture.setFaktura(faktura);
		stavkaFakture.setRb(getRedniBrojStavke());

		this.faktura.getStavkeFakture().add(stavkaFakture);

		createNewStavkaFakture();
		refreshStavke();

	}

	public String selectFaktura() {
		log.info("select faktura");
		this.faktura = (Faktura) kontrolerAL.spojObjekat(faktura);
		stavkaFakture = null;
		listStavkeFakture = null;

		return "/faktura.xhtml";
	}

	public String izborFakture() {

		this.stavkaFakture = null;
		this.listStavkeFakture = null;
		return "/izborfakture.xhtml";
	}

	public void selectStavkaFakture() {
		log.info("select stavka fakture " + stavkaFakture.getUsluga());

	}

	public void refresh() {
		log.info("refresh ");
		listFaktura = kontrolerAL.vratiListuFaktura(2009, preduzeceLoggedIn);
	}

	public void refreshStavke() {
		log.info("refresh stavke");

		listStavkeFakture = faktura.getStavkeFakture();

	}

	public String createNewFaktura() {
		log.info("create new");
		faktura = new FakturaBean();
		faktura.setBrojFakture(kontrolerAL.vratiNoviBrojFakture(2009,
				preduzeceLoggedIn));
		createNewStavkaFakture();
		this.listStavkeFakture = null;
		return "/faktura.xhtml";
	}

	public void createNewStavkaFakture() {
		log.info("create new stavka");
		stavkaFakture = null;
	}

	@Factory("listFaktura")
	@Begin(join = true)
	public void loadAll() {
		log.info("load ");
		refresh();

	}

	@Factory("listStavkeFakture")
	@Begin(join = true)
	public void loadAllStavke() {
		if (this.faktura.getId() != null) {
			this.faktura = (Faktura) kontrolerAL.spojObjekat(faktura);
		}
		refreshStavke();

	}

	public void delete() {
		log.info("delete " + faktura.getId());
		kontrolerAL.obrisiEntitet(faktura);
		createNewFaktura();
		refresh();

	}

	public void obrisiStavku() {
		log.info("delete  stavka" + stavkaFakture.getId());

		this.faktura.getStavkeFakture().remove(stavkaFakture);

		createNewStavkaFakture();
		refreshStavke();

	}

	@End(beforeRedirect = true)
	public String update() {
		log.info("update " + faktura.getId());
		kontrolerAL.sacuvajEntitet(faktura);
		return "/izborfakture.xhtml";
	}

	public void izmeniStavku() {
		log.info("update stavka" + stavkaFakture.getId());
		createNewStavkaFakture();
		refreshStavke();
	}

	public void resetStavki() {
		stavkaFakture = new StavkaFaktureBean();
	}

	public List<Komitent> vratiSveKomitente() {
		return kontrolerAL.vratiListuKomitenata(preduzeceLoggedIn);
	}

	public List<Usluga> vratiSveUsluge() {
		return kontrolerAL.vratiListuUsluga(preduzeceLoggedIn);
	}

	public List<PoreskaTarifa> vratiSvePoreze() {
		return kontrolerAL.vratiListuEntiteta(PoreskaTarifa.class);
	}

	public String printFakture() {

		return "/print.xhtml";

	}

	public void printFakturu(ActionEvent event) {

		try {

			faktura = (Faktura) kontrolerAL.spojObjekat(faktura);
			kontrolerAL.odstampajFakturu(faktura);

		} catch (Exception e) {

		}

	}

	@End(beforeRedirect = true)
	public String cancel() {
		return "/home.xhtml";
	}

}
